// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package math

// Logb返回x的二进制指数。
// 
// 特殊情况为：
// Logb（±Inf）=+Inf 
// Logb（0）=-Inf 
// Logb（NaN）=NaN 
func Logb(x float64) float64 {
	// 特殊情况
	switch {
	case x == 0:
		return Inf(-1)
	case IsInf(x, 0):
		return Inf(1)
	case IsNaN(x):
		return x
	}
	return float64(ilogb(x))
}

// Ilogb以整数形式返回x的二进制指数。
// 
// 特殊情况为：
// Ilogb（±Inf）=MaxInt32 
// Ilogb（0）=MinInt32 
// Ilogb（NaN）=MaxInt32 
func Ilogb(x float64) int {
	// 特殊情况
	switch {
	case x == 0:
		return MinInt32
	case IsNaN(x):
		return MaxInt32
	case IsInf(x, 0):
		return MaxInt32
	}
	return ilogb(x)
}

// logb返回x的二进制指数。它假设x是有限的，并且
// 非零。
func ilogb(x float64) int {
	x, exp := normalize(x)
	return int((Float64bits(x)>>shift)&mask) - bias + exp
}
